// Symbol 数据类型  表示一个独一无二的值

// shared.js =========================================

// const cache = {}

// // a.js ========================================

// cache['a_foo'] = Math.random()

// // b.js ========a_=========================

// cache['b_foo'] = '123'
// // 产生冲突
// console.log(cache);


// const s =Symbol()
// console.log(s);
// console.log(typeof s);  //Symbol

// console.log(
//     // 创建的值唯一  不能重复
//     Symbol() === Symbol()   //false
// );

// 传入字符串作为描述文本  对象可以使用Symbol作为属性名
// console.log(Symbol('foo'));
// console.log(Symbol('bar'));
// console.log(Symbol('baz'));

// 对象的键值可以使用字符串 和 Symbol  避免对象属性名重复问题
// const obj = {}
// obj[Symbol()] = '123'
// obj[Symbol()] = '456'
// console.log(obj);

// const obj = {
//     [Symbol()]: 123
// }

// console.log(obj);

// // a.js ====================================

// // Symbol还可以模拟实现对象的私有成员

// const name = Symbol()
// const person = {
//     [name]: 'zce',
//     say () {
//         console.log(this[name]);
//     }
// }

// // b.js ================================

// // person[Symbol()]
// person.say()



//--------------------------------------------------

// Symbol 补充
// console.log(
//     //Symbol() === Symbol()    //false
//     // Symbol('foo') === Symbol('foo')  //false
// );


// 使用for方法接收参数 则相同参数就会返回相同的Symbol值
// const s1 = Symbol.for('foo')
// const s2 = Symbol.for('foo')
// console.log(s1 === s2);     //true

// console.log(
//     Symbol.for(true) === Symbol.for('true')     //true
// );


// 内置Symbol常量
// console.log(Symbol.iterator);
// console.log(Symbol.hasInstance);

// const obj = {
//     //toStringTag 是Symbol常量之一
//     [Symbol.toStringTag]: 'XObject'
// }
// console.log(obj.toString());    //[object XObject]


// for-in 与 keys 都无法获取到Symbol为键名的属性
const obj = {
    [Symbol()]: 'symbol value',
    foo: 'normal value'
}

// 以下都会忽略Symbol属性为键名的属性值  因此获取对象的私有属性
// for (var key in obj) {
//     console.log(key);
// }

// console.log(Object.keys(obj));
// console.log(JSON.stringify(obj));


// 获取obj的Symlbol属性值
console.log(Object.getOwnPropertySymbols(obj));